package com.example.remotecontrol.data.model

import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import java.util.UUID

/**
 * 设备数据模型类
 * 表示一个可被遥控器控制的设备
 */
@Parcelize
data class Device(
    val id: String = UUID.randomUUID().toString(),
    val name: String,                      // 设备名称
    val brand: String,                     // 设备品牌
    val model: String = "",                // 设备型号（可选）
    val room: String = "",                 // 设备所在房间
    val type: DeviceType,                  // 设备类型
    val controlType: ControlType = ControlType.IR,
    val controlData: String = "",          // 通用控制数据（向后兼容）
    val irData: IrDeviceData? = null,      // 红外控制数据
    val bluetoothData: BluetoothDeviceData? = null, // 蓝牙控制数据
    val wifiData: WifiDeviceData? = null,  // WiFi控制数据
    val iconRes: Int? = null,              // 设备图标资源ID
    val isFavorite: Boolean = false,       // 是否为收藏设备
    val lastUsed: Long = System.currentTimeMillis() // 最后使用时间
) : Parcelable {
    /**
     * 控制类型
     */
    enum class ControlType {
        IR,         // 红外控制
        BLUETOOTH,  // 蓝牙控制
        WIFI        // WiFi控制
    }
    
    /**
     * 获取此设备支持的控制类型列表
     */
    fun getSupportedControlTypes(): List<ControlType> {
        val types = mutableListOf<ControlType>()
        
        if (irData != null) {
            types.add(ControlType.IR)
        }
        
        if (bluetoothData != null) {
            types.add(ControlType.BLUETOOTH)
        }
        
        if (wifiData != null) {
            types.add(ControlType.WIFI)
        }
        
        // 如果没有检测到任何特定类型，但设置了controlType，则添加它
        if (types.isEmpty() && controlType != null) {
            types.add(controlType)
        }
        
        return types
    }
    
    /**
     * 检查设备是否支持指定的控制类型
     */
    fun supportsControlType(type: ControlType): Boolean {
        return when(type) {
            ControlType.IR -> irData != null || controlType == ControlType.IR
            ControlType.BLUETOOTH -> bluetoothData != null || controlType == ControlType.BLUETOOTH
            ControlType.WIFI -> wifiData != null || controlType == ControlType.WIFI
        }
    }
    
    companion object {
        fun createEmpty() = Device(
            id = "",
            name = "",
            brand = "",
            model = "",
            room = "",
            type = DeviceType.TV,
            controlType = ControlType.IR
        )
    }
}

/**
 * 设备类型枚举
 */
enum class DeviceType {
    TV, AC, AUDIO, PROJECTOR, STB, DVD, GAME, OTHER;
    
    /**
     * 获取设备类型的显示名称
     */
    fun getDisplayName(): String {
        return when(this) {
            TV -> "电视"
            AC -> "空调"
            AUDIO -> "音响"
            PROJECTOR -> "投影仪"
            STB -> "机顶盒"
            DVD -> "DVD播放器"
            GAME -> "游戏机"
            OTHER -> "其他"
        }
    }
    
    companion object {
        /**
         * 根据显示名称获取设备类型
         */
        fun fromDisplayName(displayName: String): DeviceType {
            return when(displayName) {
                "电视" -> TV
                "空调" -> AC
                "音响" -> AUDIO
                "投影仪" -> PROJECTOR
                "机顶盒" -> STB
                "DVD播放器" -> DVD
                "游戏机" -> GAME
                else -> OTHER
            }
        }
        
        /**
         * 获取所有设备类型的显示名称列表
         */
        fun getAllDisplayNames(): List<String> {
            return values().map { it.getDisplayName() }
        }
    }
}

/**
 * 设备控制类型枚举
 */
enum class DeviceControlType(val displayName: String) {
    IR("红外"),
    BLUETOOTH("蓝牙"),
    WIFI("WiFi"),
    COMBINED("组合模式") // 多种控制方式组合
}

/**
 * 红外设备数据
 */
@Parcelize
data class IrDeviceData(
    val addressCode: Int,                  // 设备地址码
    val commandMap: Map<String, Int>,      // 命令映射
    val frequency: Int = 38000,            // 红外频率，默认38kHz
    val learnedCommands: Map<String, IntArray> = emptyMap() // 学习的命令
) : Parcelable

/**
 * 蓝牙设备数据
 */
@Parcelize
data class BluetoothDeviceData(
    val macAddress: String,                // MAC地址
    val deviceName: String = "",           // 设备名称
    val serviceUUID: String? = null,       // 服务UUID
    val characteristicUUID: String? = null // 特征UUID
) : Parcelable

/**
 * WiFi设备数据
 */
@Parcelize
data class WifiDeviceData(
    val ipAddress: String,                 // IP地址
    val port: Int = 80,                    // 端口，默认80
    val protocol: WifiProtocol = WifiProtocol.HTTP, // 协议类型
    val authToken: String? = null,         // 授权令牌
    val apiEndpoints: Map<String, String> = emptyMap() // API端点映射
) : Parcelable

/**
 * WiFi协议类型
 */
enum class WifiProtocol {
    HTTP,
    MQTT,
    UDP,
    TCP
} 